﻿using Onshi.POS.Formularios.Properties;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Enumeradores;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Onshi.POS.Vendedores.Vistas;
using Onshi.POS.Vendedores;
using Onshi.POS.Modelo.Objectos;
using System.IO;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Entidades.Tipos;
using System.Configuration;

namespace Onshi.POS.Formularios
{
    public partial class VendedoresAltaModificacion : FormularioBase, IVendedoresAltaModificacion
    {
        #region Constructores

        public VendedoresAltaModificacion()
        {
            InitializeComponent();
            Text = "Nuevo vendedor";
            presentador = new VendedoresAltaModificacionPresentador(this);
        }

        public VendedoresAltaModificacion(Int32 idVendedor)
            : this()
        {
            Text = "Modificar vendedor";
            this.idVendedor = idVendedor;
        }

        #endregion

        #region Atributos

        private VendedoresAltaModificacionPresentador presentador;
        private Int32 idVendedor;
        private Int32 domicilioId;
        private String domicilioCalle;
        private String domicilioNumero;
        private String domicilioPiso;
        private String domicilioDepartamento;
        private Byte domicilioIdTipoDomicilio;
        private Int32 domicilioIdBarrio;
        private Int32 telefonoId;
        private String telefonoCodigoArea;
        private String telefonoNumero;
        private Byte telefonoIdTipoTelefono;
        private Int16 configuracionImagen;

        #endregion

        #region Propiedades

        [Browsable(false)]
        public Int32 DomicilioId
        {
            get { return domicilioId; }
        }

        [Browsable(false)]
        public List<DomicilioVendedor> ListadoDomicilios
        {
            get { return ((SortableList<DomicilioVendedor>)bsDomicilios.DataSource).ToList(); }
            set { bsDomicilios.DataSource = new SortableList<DomicilioVendedor>(value); }
        }

        [Browsable(false)]
        public List<TelefonoVendedor> ListadoTelefonos
        {
            get { return ((SortableList<TelefonoVendedor>)bsTelefonos.DataSource).ToList(); }
            set { bsTelefonos.DataSource = new SortableList<TelefonoVendedor>(value); }
        }

        [Browsable(false)]
        public Int32 DomicilioIdBarrio
        {
            get { return domicilioIdBarrio; }
        }

        [Browsable(false)]
        public Byte DomicilioIdTipoDomicilio
        {
            get { return domicilioIdTipoDomicilio; }
        }

        [Browsable(false)]
        public String DomicilioCalle
        {
            get { return domicilioCalle; }
        }

        [Browsable(false)]
        public String DomicilioNumero
        {
            get { return domicilioNumero; }
        }

        [Browsable(false)]
        public String DomicilioPiso
        {
            get { return domicilioPiso; }
        }

        [Browsable(false)]
        public String DomicilioDepartamento
        {
            get { return domicilioDepartamento; }
        }

        [Browsable(false)]
        public Int32 TelefonoId
        {
            get { return telefonoId; }
        }

        [Browsable(false)]
        public Byte TelefonoIdTipoTelefono
        {
            get { return telefonoIdTipoTelefono; }
        }

        [Browsable(false)]
        public String TelefonoCodigoArea
        {
            get { return telefonoCodigoArea; }
        }

        [Browsable(false)]
        public String TelefonoNumero
        {
            get { return telefonoNumero; }
        }

        [Browsable(false)]
        public Int16 ConfiguracionImagen
        {
            set { configuracionImagen = value; }
        }

        [Browsable(false)]
        public List<VendedorCampoPersonalizadoVendedor> ListadoCamposPersonalizados
        {
            get
            {
                var listado = new List<VendedorCampoPersonalizadoVendedor>();
                foreach (var control in panCamposPersonalizados.Controls)
                    if (control.GetType() == typeof(Panel))
                        foreach (var controlHijo in ((Panel)control).Controls)
                            if (controlHijo.GetType() == typeof(TextoBase))
                            {
                                if (!String.IsNullOrWhiteSpace(((TextoBase)controlHijo).Text))
                                    listado.Add(new VendedorCampoPersonalizadoVendedor()
                                    {
                                        Entidad = new CampoPersonalizadoVendedor()
                                        {
                                            Id = Convert.ToInt32(((Panel)control).Name)
                                        },
                                        Valor = ((TextoBase)controlHijo).Text
                                    });
                                break;
                            }
                return listado;
            }
            set
            {
                var alto = 3;
                foreach (var item in value)
                {
                    var panel = new Panel();
                    panel.Name = Convert.ToString(item.Entidad.Id);
                    panel.Size = new Size(632, 45);
                    panel.Location = new Point(3, alto);
                    panel.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;

                    var etiqueta = new EtiquetaBase();
                    etiqueta.Location = new Point(3, 6);
                    etiqueta.AutoSize = true;
                    etiqueta.Text = item.Entidad.Nombre;

                    var texto = new TextoBase();
                    texto.Size = new Size(586, 20);
                    texto.Location = new Point(3, 22);
                    texto.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
                    texto.Text = item.Valor;

                    panel.Controls.Add(etiqueta);
                    panel.Controls.Add(texto);

                    panCamposPersonalizados.Controls.Add(panel);
                    alto += 51;
                }
            }
        }

        [Browsable(false)]
        public Int32 IdUsuarioSistema
        {
            get { return Principal.IdUsuarioSistema; }
        }

        [Browsable(false)]
        public Int32 IdVendedor
        {
            get { return idVendedor; }
        }

        [Browsable(false)]
        public Int32 IdRubroVendedor
        {
            get { return ucRubroVendedor.IdRubroVendedorSeleccionado; }
            set
            {
                ucRubroVendedor.IdRubroVendedorSeleccionado = value;
                ucRubroVendedor.Actualizar();
            }
        }

        [Browsable(false)]
        public Byte IdTipoComisionVendedor
        {
            get { return (Byte)cboTipoComisionVendedor.SelectedValue; }
            set { cboTipoComisionVendedor.SelectedValue = value; }
        }

        [Browsable(false)]
        public String Codigo
        {
            get { return txtCodigo.Text; }
            set { txtCodigo.Text = value; }
        }

        [Browsable(false)]
        public String Nombre
        {
            get { return txtNombre.Text; }
            set { txtNombre.Text = value; }
        }

        [Browsable(false)]
        public Decimal Comision
        {
            get { return numComision.Value; }
            set { numComision.Value = value; }
        }

        [Browsable(false)]
        public Decimal ComisionMaxima
        {
            get { return numComisionMaxima.Value; }
            set { numComisionMaxima.Value = value; }
        }

        [Browsable(false)]
        public String Email
        {
            get { return txtEmail.Text; }
            set { txtEmail.Text = value; }
        }

        [Browsable(false)]
        public String SitioWeb
        {
            get { return txtSitioWeb.Text; }
            set { txtSitioWeb.Text = value; }
        }

        [Browsable(false)]
        public String Observaciones
        {
            get { return txtObservaciones.Text; }
            set { txtObservaciones.Text = value; }
        }

        [Browsable(false)]
        public Byte[] Imagen
        {
            get { return ManejoImagen.ImagenAByte(picImagen.Image); }
            set
            {
                picImagen.Image = ManejoImagen.ByteAImagen(value);
                if (value == null)
                {
                    btnImagenAgregar.Enabled = true;
                    btnImagenQuitar.Enabled = false;
                }
                else
                {
                    btnImagenAgregar.Enabled = false;
                    btnImagenQuitar.Enabled = true;
                }
            }
        }

        #endregion

        #region Eventos

        private void VendedoresAltaModificacion_Load(Object sender, EventArgs e)
        {
            try
            {
                cboTipoComisionVendedor.Actualizar();
                presentador.Inicializar();
                if (idVendedor == 0)
                {
                    ucRubroVendedor.IdRubroVendedorSeleccionado = (Int32)EnumRubrosVendedores.RubroUnico;
                    ucRubroVendedor.Actualizar();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void cboTipoComisionVendedor_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            switch ((EnumTiposComisionesVendedores)(Byte)cboTipoComisionVendedor.SelectedValue)
            {
                case EnumTiposComisionesVendedores.SinComision:
                    numComision.Enabled = false;
                    numComisionMaxima.Enabled = false;
                    numComision.Value = 0;
                    numComisionMaxima.Value = 0;
                    break;
                case EnumTiposComisionesVendedores.PorcentajeVenta:
                case EnumTiposComisionesVendedores.PorcentajeGanancia:
                    numComision.Enabled = true;
                    numComisionMaxima.Enabled = true;
                    break;
                case EnumTiposComisionesVendedores.MontoFijo:
                    numComision.Enabled = true;
                    numComisionMaxima.Enabled = false;
                    numComisionMaxima.Value = 0;
                    break;
            }
        }

        private void btnImagenAgregar_Click(Object sender, EventArgs e)
        {
            if (diaImagen.ShowDialog() == DialogResult.OK && !String.IsNullOrWhiteSpace(diaImagen.FileName))
            {
                var archivo = new FileInfo(diaImagen.FileName);
                if (archivo.Length / 1024 > configuracionImagen)
                    MessageBox.Show(String.Format("El tamaño de la imagen supera los {0}kb", configuracionImagen), ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                else
                {
                    picImagen.Load(diaImagen.FileName);
                    btnImagenAgregar.Enabled = false;
                    btnImagenQuitar.Enabled = true;
                }
            }
        }

        private void btnImagenQuitar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea quitar la imagen?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                picImagen.Image = null;
                btnImagenAgregar.Enabled = true;
                btnImagenQuitar.Enabled = false;
            }
        }

        private void btnAceptar_Click(Object sender, EventArgs e)
        {
            var validado = true;
            errVendedoresAltaModificacion.Clear();
            if (String.IsNullOrWhiteSpace(txtCodigo.Text))
            {
                validado = false;
                errVendedoresAltaModificacion.SetError(txtCodigo, "El código no puede quedar vacío");
            }
            if (String.IsNullOrWhiteSpace(txtNombre.Text))
            {
                validado = false;
                errVendedoresAltaModificacion.SetError(txtNombre, "El nombre no puede quedar vacío");
            }
            if (ucRubroVendedor.IdRubroVendedorSeleccionado == 0)
            {
                validado = false;
                errVendedoresAltaModificacion.SetError(ucRubroVendedor, "El rubro no puede quedar vacío");
            }

            if (validado)
            {
                try
                {
                    presentador.Aceptar();
                    DialogResult = System.Windows.Forms.DialogResult.OK;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
                solVendedor.SelectedTab = tabGeneral;
        }

        private void btnCancelar_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void btnDomicilioAgregar_Click(Object sender, EventArgs e)
        {
            var domicilios = new Domicilios();
            if (domicilios.ShowDialog() == DialogResult.OK)
            {
                domicilioId = domicilios.Id;
                domicilioIdBarrio = domicilios.IdBarrio;
                domicilioIdTipoDomicilio = domicilios.IdTipoDomicilio;
                domicilioCalle = domicilios.Calle;
                domicilioNumero = domicilios.Numero;
                domicilioPiso = domicilios.Piso;
                domicilioDepartamento = domicilios.Departamento;
                try
                {
                    presentador.DomicilioAgregar();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void btnDomicilioQuitar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea quitar el domicilio?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                domicilioId = ((DomicilioVendedor)bsDomicilios.Current).Id;
                try
                {
                    presentador.DomicilioQuitar();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void btnDomicilioEditar_Click(Object sender, EventArgs e)
        {
            var domicilios = new Domicilios(((DomicilioVendedor)bsDomicilios.Current).Id,
                ((DomicilioVendedor)bsDomicilios.Current).Tipo.Id,
                ((DomicilioVendedor)bsDomicilios.Current).Barrio.Id,
                ((DomicilioVendedor)bsDomicilios.Current).Calle,
                ((DomicilioVendedor)bsDomicilios.Current).Numero,
                ((DomicilioCliente)bsDomicilios.Current).Piso,
                ((DomicilioVendedor)bsDomicilios.Current).Departamento);
            if (domicilios.ShowDialog() == DialogResult.OK)
            {
                domicilioId = domicilios.Id;
                domicilioIdBarrio = domicilios.IdBarrio;
                domicilioIdTipoDomicilio = domicilios.IdTipoDomicilio;
                domicilioCalle = domicilios.Calle;
                domicilioNumero = domicilios.Numero;
                domicilioPiso = domicilios.Piso;
                domicilioDepartamento = domicilios.Departamento;
                try
                {
                    presentador.DomicilioEditar();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void grdDomicilios_SelectionChanged(Object sender, EventArgs e)
        {
            if (bsDomicilios.Current != null)
            {
                btnDomicilioEditar.Enabled = true;
                btnDomicilioQuitar.Enabled = true;
            }
            else
            {
                btnDomicilioEditar.Enabled = false;
                btnDomicilioQuitar.Enabled = false;
            }
        }

        private void btnTelefonoAgregar_Click(Object sender, EventArgs e)
        {
            var telefonos = new Telefonos();
            if (telefonos.ShowDialog() == DialogResult.OK)
            {
                telefonoId = telefonos.Id;
                telefonoIdTipoTelefono = telefonos.IdTipoTelefono;
                telefonoCodigoArea = telefonos.CodigoArea;
                telefonoNumero = telefonos.Numero;
                try
                {
                    presentador.TelefonoAgregar();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void btnTelefonoQuitar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea quitar el teléfono?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                telefonoId = ((TelefonoVendedor)bsTelefonos.Current).Id;
                try
                {
                    presentador.TelefonoQuitar();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void btnTelefonoEditar_Click(Object sender, EventArgs e)
        {
            var telefonos = new Telefonos(((TelefonoVendedor)bsTelefonos.Current).Id,
                ((TelefonoVendedor)bsTelefonos.Current).Tipo.Id,
                ((TelefonoVendedor)bsTelefonos.Current).CodigoArea,
                ((TelefonoVendedor)bsTelefonos.Current).Numero);
            if (telefonos.ShowDialog() == DialogResult.OK)
            {
                telefonoId = telefonos.Id;
                telefonoIdTipoTelefono = telefonos.IdTipoTelefono;
                telefonoCodigoArea = telefonos.CodigoArea;
                telefonoNumero = telefonos.Numero;
                try
                {
                    presentador.TelefonoEditar();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void grdTelefonos_SelectionChanged(Object sender, EventArgs e)
        {
            if (bsTelefonos.Current != null)
            {
                btnTelefonoEditar.Enabled = true;
                btnTelefonoQuitar.Enabled = true;
            }
            else
            {
                btnTelefonoEditar.Enabled = false;
                btnTelefonoQuitar.Enabled = false;
            }
        }

        #endregion
    }
}
